home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / networke / cow / cowl-1.000 / cowl-1 / reserved.c < prev    next >
C/C++ Source or Header  |  1994-05-05  |  3KB  |  111 lines

  1.  
  2. /* reserved.c (adapted for trekhopd)
  3.  * 
  4.  * Kevin P. Smith   7/3/89 */
  5. #include "copyright2.h"
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <netdb.h>
  11. #include "Wlib.h"
  12. #include "defs.h"
  13. #include "struct.h"
  14. #include "data.h"
  15. #include "packets.h"
  16.  
  17. #ifdef GATEWAY
  18. extern unsigned LONG netaddr;
  19.  
  20. #endif
  21.  
  22. makeReservedPacket(struct reserved_spacket *packet)
  23. {
  24.   int     i;
  25.  
  26.   for (i = 0; i < 16; i++)
  27.     {
  28.       packet->data[i] = RANDOM() % 256;
  29.     }
  30.   packet->type = SP_RESERVED;
  31. }
  32.  
  33. /* A "random" table we use to hose our data. */
  34.  
  35. static unsigned char swap[16][16] =
  36. {
  37.   {4, 13, 9, 7, 5, 8, 14, 2, 10, 11, 6, 3, 12, 15, 0, 1},
  38.   {0, 4, 12, 5, 15, 2, 7, 3, 14, 6, 1, 10, 8, 13, 11, 9},
  39.   {9, 5, 4, 2, 3, 6, 10, 12, 1, 7, 15, 14, 11, 0, 13, 8},
  40.   {5, 8, 15, 4, 6, 9, 1, 12, 10, 3, 13, 11, 2, 7, 0, 14},
  41.   {15, 13, 1, 14, 4, 0, 8, 12, 11, 9, 2, 10, 3, 6, 7, 5},
  42.   {6, 7, 9, 11, 14, 1, 4, 13, 2, 12, 8, 15, 10, 0, 5, 3},
  43.   {11, 0, 10, 14, 7, 12, 2, 4, 15, 13, 3, 9, 1, 5, 8, 6},
  44.   {9, 8, 2, 10, 12, 14, 3, 7, 4, 0, 11, 1, 5, 15, 6, 13},
  45.   {15, 12, 3, 0, 10, 8, 13, 9, 14, 2, 4, 5, 7, 6, 1, 11},
  46.   {14, 3, 0, 11, 2, 10, 15, 12, 13, 1, 5, 4, 6, 8, 7, 9},
  47.   {1, 2, 7, 3, 8, 0, 10, 14, 6, 5, 13, 12, 4, 9, 11, 15},
  48.   {2, 1, 11, 9, 7, 3, 12, 6, 5, 8, 0, 10, 14, 4, 15, 13},
  49.   {0, 12, 15, 1, 13, 7, 6, 5, 3, 14, 11, 8, 9, 10, 2, 4},
  50.   {10, 9, 0, 6, 1, 14, 5, 12, 7, 4, 15, 13, 8, 2, 3, 11},
  51.   {3, 11, 6, 12, 10, 5, 14, 1, 9, 15, 7, 2, 13, 8, 4, 0},
  52.   {12, 6, 5, 8, 14, 4, 13, 15, 10, 0, 11, 9, 3, 1, 7, 2}
  53. };
  54.  
  55. encryptReservedPacket(struct reserved_spacket *spacket, struct reserved_cpacket *cpacket, int server, int pno)
  56. {
  57.   struct sockaddr_in saddr;
  58.   struct hostent *hp;
  59.   struct in_addr address;
  60.   unsigned char mixin1, mixin2, mixin3, mixin4, mixin5;
  61.   int     i, j, k;
  62.   char    buf[16];
  63.   unsigned char *s;
  64.   int     len;
  65.  
  66. #ifndef GATEWAY
  67.   unsigned LONG netaddr = 0;
  68.  
  69. #endif
  70.  
  71.   MCOPY(spacket->data, cpacket->data, 16);
  72.   MCOPY(spacket->data, cpacket->resp, 16);
  73.   cpacket->type = CP_RESERVED;
  74.  
  75.   /* if we didn't get it from -H, go ahead and query the socket */
  76.   if (netaddr == 0)
  77.     {
  78.       len = sizeof(saddr);
  79.       if (getpeername(sock, (struct sockaddr *) &saddr, &len) < 0)
  80.     {
  81.       perror("getpeername(sock)");
  82.       exit(1);
  83.     }
  84.       netaddr = saddr.sin_addr.s_addr;
  85.     }
  86.  
  87.   /* printf("Verifying with netaddr %x\n", netaddr); */
  88.   mixin1 = (netaddr >> 24) & 0xff;
  89.   mixin2 = pno;
  90.   mixin3 = (netaddr >> 16) & 0xff;
  91.   mixin4 = (netaddr >> 8) & 0xff;
  92.   mixin5 = netaddr & 0xff;
  93.  
  94.   j = 0;
  95.   for (i = 0; i < 23; i++)
  96.     {
  97.       j = (j + cpacket->resp[j]) & 15;
  98.       s = swap[j];
  99.       cpacket->resp[s[i % 7]] ^= mixin1;
  100.       cpacket->resp[s[i % 5]] ^= mixin2;
  101.       cpacket->resp[s[i % 13]] ^= mixin3;
  102.       cpacket->resp[s[i % 3]] ^= mixin4;
  103.       cpacket->resp[s[i % 11]] ^= mixin5;
  104.       for (k = 0; k < 16; k++)
  105.     {
  106.       buf[k] = cpacket->resp[s[k]];
  107.     }
  108.       MCOPY(buf, cpacket->resp, 16);
  109.     }
  110. }
  111.